﻿using System.Drawing;
using System.IO;

namespace RA_WebSite.Models
{
    public static class RidimensionaImmagine
    {
        public static byte[] CreateThumbnail(byte[] passedImage, int largestSide)
        {
            byte[] returnedThumbnail;

            using (MemoryStream startMemoryStream = new MemoryStream(),
                                newMemoryStream = new MemoryStream())
            {
                // scrive la strnga in uno stream
                startMemoryStream.Write(passedImage, 0, passedImage.Length);

                // Crea una immagine partendo da uno MemoryStream che contiene l'immagine
                var startBitmap = new Bitmap(startMemoryStream);

                // Imposta la proporzione di altenza e largehzza della miniatura dell'immagine originale 
                int newHeight;
                int newWidth;
                double hwRatio;
                if (startBitmap.Height > startBitmap.Width)
                {
                    newHeight = largestSide;
                    hwRatio = (double)((double)largestSide / (double)startBitmap.Height);
                    newWidth = (int)(hwRatio * (double)startBitmap.Width);
                }
                else
                {
                    newWidth = largestSide;
                    hwRatio = (double)((double)largestSide / (double)startBitmap.Width);
                    newHeight = (int)(hwRatio * (double)startBitmap.Height);
                }

                // Crea una nuova immagine con le dimensioni della miniatura
                Bitmap newBitmap;

                // Copia l'immagine dall'immagine di aprtenza alla nuova immagine, creando una miniatura
                newBitmap = ResizeImage(startBitmap, newWidth, newHeight);

                // Salva l'immagine in uno stream in un formato scelto
                newBitmap.Save(newMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);

                // Riempie l'array di byte della miniatura presa dal MemoryStream
                returnedThumbnail = newMemoryStream.ToArray();
            }

            // Ritorna l'immagine ridimensionata come un array di byte
            return returnedThumbnail;
        }

        /// <summary>
        /// Ridimensiona una immaggine
        /// </summary>
        /// <param name="image"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
 
        private static Bitmap ResizeImage(Bitmap image, int width, int height)
        {
            Bitmap resizedImage = new Bitmap(width, height);
            using (Graphics gfx = Graphics.FromImage(resizedImage))
            {
                gfx.DrawImage(image, new Rectangle(0, 0, width, height),
                    new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
            }
            return resizedImage;
        }

        /// <summary>
        /// Converte un immagine in un array di byte
        /// </summary>
        /// <param name="imageIn"></param>
        /// <returns></returns>
        public static byte[] ImageToByteArray(Image imageIn)
        {
            var ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            return ms.ToArray();
        }
        
        /// <summary>
        /// Converte un array di byte in immagine
        /// </summary>
        /// <param name="byteArrayIn"></param>
        /// <returns></returns>
        public static Image ByteArrayToImage(byte[] byteArrayIn)
        {
            var ms = new MemoryStream(byteArrayIn);
            var returnImage = Image.FromStream(ms);
            return returnImage;
        }

    }
}